home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / UNIXLIB37B / !UnixLib37 / src / signal / c / sigprocmsk < prev    next >
Text File  |  1996-11-09  |  2KB  |  84 lines

  1. /****************************************************************************
  2.  *
  3.  * $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigprocmsk,v $
  4.  * $Date: 1996/10/30 22:04:51 $
  5.  * $Revision: 1.1 $
  6.  * $State: Rel $
  7.  * $Author: unixlib $
  8.  *
  9.  * $Log: sigprocmsk,v $
  10.  * Revision 1.1  1996/10/30 22:04:51  unixlib
  11.  * Initial revision
  12.  *
  13.  ***************************************************************************/
  14.  
  15. static const char rcs_id[] = "$Id: sigprocmsk,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
  16.  
  17. /* signal.c.sigprocmsk: Implementation of the POSIX signal function
  18.    sigprocmask.
  19.  
  20.    Written by Nick Burrett, 5 October 1996.  */
  21.  
  22. #include <errno.h>
  23. #include <signal.h>
  24. #include <sys/unix.h>
  25.  
  26. /* If SET is not NULL, modify the current set of blocked signals
  27.    according to HOW, which may be SIG_BLOCK, SIG_UNBLOCK or SIG_SETMASK.
  28.    If OSET is not NULL, store the old set of blocked signals in *OSET.
  29.  
  30.    If invoking sigprocmask causes any pending signals to be unblocked,
  31.    at least one of those signals will be delivered to the process
  32.    before sigprocmask returns.  The order in which pending signals
  33.    are delivered is not specified.  */
  34.  
  35. int sigprocmask (int how, const sigset_t *nset, sigset_t *oset)
  36. {
  37.   unsigned int mask;
  38.   sigset_t set;
  39.  
  40.   if (oset != NULL)
  41.     *oset = __u->sigstate.blocked;
  42.  
  43.   if (nset == NULL)
  44.     return 0;
  45.  
  46.   set = *nset;
  47.  
  48.   /* Don't block SIGKILL or SIGSTOP.  */
  49.   if (sigismember (&set, SIGKILL))
  50.     sigdelset (&set, SIGKILL);
  51.  
  52.   if (sigismember (&set, SIGSTOP))
  53.     sigdelset (&set, SIGSTOP);
  54.  
  55.   mask = (unsigned int)set;
  56.  
  57.   if (how == SIG_BLOCK)
  58.     {
  59.       /* This will always block more signals,
  60.          so we don't have to worry about delivering
  61.          pending signals.  */
  62.       __u->sigstate.blocked &= mask;
  63.     }
  64.   else if (how == SIG_UNBLOCK)
  65.     {
  66.       __u->sigstate.blocked &= ~mask;
  67.       /* Cause delivery of some pending signals.  */
  68.       __unixlib_raise_signal (0, 0, 0, 0);
  69.     }
  70.   else if (how == SIG_SETMASK)
  71.     {
  72.       __u->sigstate.blocked = mask;
  73.       /* The new mask might have unblocked a few signals so try and
  74.          deliver the pending ones.  */
  75.       __unixlib_raise_signal (0, 0, 0, 0);
  76.     }
  77.   else
  78.     {
  79.       errno = EINVAL;
  80.       return -1;
  81.     }
  82.   return 0;
  83. }
  84.